/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.siagefi.mb;



import br.siagefi.enuns.TipoConta;
import br.siagefi.model.ContaBancaria;
import br.siagefi.service.ContaBancariaService;
import br.siagefi.util.FacesUtil;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.validator.ValidatorException;

/**
 *
 * @author NOTE
 */

@ManagedBean
@SessionScoped
public class ContaBean implements Serializable{
    
   private ContaBancaria conta;
   private final ContaBancariaService service;
   private List<ContaBancaria> contas;
   private String tipodeConta;
   private boolean exibirDadosBancarios;
   private boolean habilitarBotao;

    public ContaBean() {
        this.conta = new ContaBancaria();
        this.service = new ContaBancariaService();
        this.carregarLista();
        this.tipodeConta = "";
        this.exibirDadosBancarios = false;
        this.habilitarBotao = true;
    }
    
    // regras de negócio
    
    public void encerrarConta(){
        if(service.existeLancamentoVinculadoAVencer(conta)){
            FacesUtil.addErrorMessage("Conta possui lançamentos vinculados a vencer. Encerramento não permitido.");
        }else {
            this.conta.setDataEncerramento(Calendar.getInstance().getTime());
            this.conta.setSituacao("Encerrada");
            service.alterar(this.getConta());
            FacesUtil.addSuccessMessage("Conta encerrada com sucesso");
        }
    }
    
    // navegação
    
    public String alterar(ContaBancaria conta){
        this.setConta(conta);
        if(conta.getBanco() != null){
            this.setExibirDadosBancarios(true);
        }
        return "/administrador/incluirConta";
    }
    
    public String voltar(){
        this.limparFormulario();
        this.carregarLista();
        this.setExibirDadosBancarios(false);
        return "/administrador/conta";
    }
    
    public String apresentarDadosBancarios(){
            this.setExibirDadosBancarios(true);
            System.out.println("exibir dados bancários");
            return "/administrador/incluirConta";
    }
    
    // persistência
    
    public void gravar(){
       if(this.getConta().getId() == null){
           //incluir
           if(service.jaExiste(this.getConta())){
              FacesUtil.addErrorMessage("Conta já cadastrada.");
           }else {
              this.getConta().setSituacao("Aberta");
              service.inserir(this.getConta());
              FacesUtil.addSuccessMessage("Conta incluida com sucesso!");
           }
        }else{ 
           //alterar
           service.alterar(conta);
           FacesUtil.addSuccessMessage("Conta alterada com sucesso!");
       }
       this.listar();
    }
    
    public void remover(ContaBancaria conta){
        if(service.existeLancamentoVinculado(conta)){
            FacesUtil.addErrorMessage("Conta com lançamentos vinculados. Exclusão não permitida.");
        }else {
            service.remover(this.getConta());
            this.limparFormulario();
            FacesUtil.addSuccessMessage("Conta excluida com sucesso!");
        }
        this.listar();
    }
    
    public final void listar(){
         this.contas = service.listar();
    }
    
    // validadores
    
    public void validateNomeIguais(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if(value != null){
          String nome = value.toString();
          for (ContaBancaria c : contas) 
                if(nome.equalsIgnoreCase(c.getNome()) && c.getId() != this.getConta().getId())
                    throw new ValidatorException(new FacesMessage("Nome de conta já utilizado!"));
        }
    }
    
    // métodos de apoio 
    
    public void limparFormulario(){
        this.conta = new ContaBancaria();
    }
    
    public final void carregarLista(){
         this.contas = service.listar();
    }
    
     public String desabilitarInclusaoDadosBancarios(AjaxBehaviorEvent event){
        String tpConta = event.getComponent().getAttributes().get("value").toString();
        if(tpConta.equals("BANCARIA")){
            this.setHabilitarBotao(false);
        }else{
            this.setHabilitarBotao(true);
        }
        return "/administrador/incluirConta";
    }
    
    
    // listas e enuns
    
     public List<TipoConta> getTipoConta() {
        return Arrays.asList(TipoConta.values());
    }
    
    // getters e setters
    
    public ContaBancaria getConta() {
        return conta;
    }

    public void setConta(ContaBancaria conta) {
        this.conta = conta;
    }

    public List<ContaBancaria> getContas() {
        return contas;
    }

    public void setContas(List<ContaBancaria> contas) {
        this.contas = contas;
    }

    public String getTipodeConta() {
        return tipodeConta;
    }

    public void setTipodeConta(String tipodeConta) {
        this.tipodeConta = tipodeConta;
    }

    public boolean isExibirDadosBancarios() {
        return exibirDadosBancarios;
    }

    public void setExibirDadosBancarios(boolean exibirDadosBancarios) {
        this.exibirDadosBancarios = exibirDadosBancarios;
    }

    public boolean isHabilitarBotao() {
        return habilitarBotao;
    }

    public void setHabilitarBotao(boolean habilitarBotao) {
        this.habilitarBotao = habilitarBotao;
    }
    
    
}
